package generice;

/**
 * 测试泛型
 */
public class Demo1 {
    public static void main(String[] args) {
        //如果不指定泛型，那么泛型则为默认的原型:Object
        TransferObject o = new TransferObject();
        o.setSender("范传奇");
        o.setReceiver("王克晶");
        o.setData("你好！");//setData(T t)  T:Object
        o.setData(123);//自动装箱(Integer.valueOf(123);)

        TransferObject<String> o1 = new TransferObject<>(); //T:String
//        o1.setData(123);//编译器会检查实参类型是否符合泛型要求，不符合编译不通过
        o1.setData("hello!");

        //泛型不能指定基本类型，因此只能使用对应的包装类
        TransferObject<Integer> o2 = new TransferObject<>();
        o2.setData(123);//会自动装箱
//        o2.setData("hello!");//编译不通过，类型不匹配

        //如果没有指定泛型
//        Object d = o.getData();//接收泛型返回值时也需要使用原型Object
        String s = (String)o.getData();//获取实际类型需要自行造型(可能存在类造型异常)

        //o1实例化时指定的泛型为String类型，因此获取时无需造型
        String s1 = o1.getData();//获取时public T getData()  T:String
        Integer i = o2.getData();//编译器会自动补充造型操作
    }
}
